<?php

/*
  Aurus CMS - free OOP CMS
  Copyright (C) 2010  Nestor Yanchuk

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

class Adminarea implements Core {
	
	/**
	 * Return an instance of class
	 *
	 * @return Adminarea
	 */
	public static function getInstance() {
		return Factory::get(__CLASS__);
	}
	
	/**
	 * Array of information rows in adminarea`s main page
	 * For example:
	 * Array(
	 * 'PHP Version' => '5.3.2',
	 * 'MySQL version' => '5.1.40-community'
	 * )
	 * @access private
	 * @var array
	 */
	private $adminInfoRows = array ();
	private $adminblocks = array ();
	private $adminblocksCont = array ();
	
	/**
	 * Get main information for adminarea main page
	 *
	 */
	private function getInfo() {
		$msize = 0;
		$msizeq = Mysql::getInstance()->query("SHOW TABLE STATUS");
		while ( $row = Mysql::getInstance()->fetch_assoc($msizeq) ) {
			$msize += $row['Data_length'] + $row['Index_length'];
		}
		$msize = formatFileSize($msize);
		$savemode = (ini_get('safe_mode') == 1) ? __('Увімкнено') : __('Вимкнено');
		$mysqlVersion = mysql_get_server_info();
		$memLimit = ini_get('memory_limit');
		$maxUploadFileSize = ini_get('upload_max_filesize');
		$gdVer = gd_info();
		
		if (function_exists('apache_get_modules')) {
			if (in_array('mod_rewrite', apache_get_modules())) {
				$modRewrite = __('Увімкнено');
			} else {
				$modRewrite = '<font color="red">' . __('Вимкнено') . '</font>';
			}
		} else {
			$modRewrite = __('Не визначено');
		}
		Adminarea::getInstance()->addAdminInfoRow(__('Версія інтерпритатора PHP'), phpversion());
		Adminarea::getInstance()->addAdminInfoRow(__('Версія бази даних MySQL'), $mysqlVersion);
		Adminarea::getInstance()->addAdminInfoRow(__('Версія GD'), $gdVer['GD Version']);
		Adminarea::getInstance()->addAdminInfoRow(__('Максимальний об\'єм завантажуваного файлу'), $maxUploadFileSize);
		Adminarea::getInstance()->addAdminInfoRow(__('Ліміт оперативної пам\'яті'), $memLimit);
		Adminarea::getInstance()->addAdminInfoRow(__('Безпечний режим'), $savemode);
		Adminarea::getInstance()->addAdminInfoRow(__('Дружні посилання'), $modRewrite);
		
		Adminarea::getInstance()->addAdminBlock('main', __('Основні налаштування'), 1);
		Adminarea::getInstance()->addToAdminBlockLink('main', 'main', __('Налаштування сайту'));
		Adminarea::getInstance()->addToAdminBlockLink('main', 'mods', __('Налаштування додатків'));
		Adminarea::getInstance()->addToAdminBlockLink('main', 'templates', __('Редагування шаблонів'));
		Adminarea::getInstance()->addToAdminBlockLink('main', 'clearcache', __('Очистити кеш'));
		Adminarea::getInstance()->addToAdminBlockLink('main', 'phpinfo', __('Перегляд інформації про PHP'));
		Adminarea::getInstance()->addToAdminBlockLink('main', 'minisqladmin', __('Виконати запит до БД'));
	}
	
	/**
	 * Check if user logged.If not logged - show login form
	 *
	 * @return void
	 */
	private function checkLogged() {
		if (! Users::getInstance()->is_logged()) {
			$tpl = Template::getInstance();
			$tpl->setTemplate(file_get_contents(ROOT . '/adminarea/template/login.tpl'));
			$tpl->set('{ROOT}', LINK_ROOT);
			$tpl->set('{logIn}', __('Увійти'));
			$tpl->set('{login}', __('Логін'));
			$tpl->set('{pass}', __('Пароль'));
			$tpl->set('{login-action}', Url::formatUrl('users', array ('do' => 'login' )));
			die($tpl->out());
		} elseif (! boolean(Users::getInstance()->can(Users::getInstance()->getLoggedUsersData('group'), 'adminVisit'))) {
			die('Киш, панаєхало!!');
		}
	}
	
	function getMenu() {
		$con = '';
		
		Aurus::getInstance()->includeJs(LINK_ROOT . 'scripts/jquery_ui.js');
		
		$blocks = Adminarea::getInstance()->getAdminBlocks();
		$blockCont = Adminarea::getInstance()->getAdminBlocksContent();
		ksort($blocks);
		
		$tpl = Template::getInstance();
		
		foreach ( $blocks as $num => $arr ) {
			foreach ( $arr as $id => $name ) {
				$tpl->setTemplate(file_get_contents(ROOT . '/adminarea/template/block.tpl'));
				$tpl->set('{id}', $id);
				$tpl->set('{cont}', $blockCont[$id]);
				$tpl->set('{title}', $name);
				$tpl->set('{ROOT}', LINK_ROOT);
				$con .= $tpl->out();
			}
		}
		
		$tpl->setTemplate(file_get_contents(ROOT . '/adminarea/template/menu.tpl'));
		$tpl->set('{ROOT}', LINK_ROOT);
		$tpl->set('{content}', $con);
		$tpl->set('{hideall}', __('Сховати все'));
		$tpl->set('{showall}', __('Показати все'));
		$tpl->set('{top}', '<a target="_blank" href="' . LINK_ROOT . '">' . __('Перейти на сайт') . '</a> | <a target="_top" href="' . Url::formatUrl('users', array ('do' => 'login', 'action' => 'logout' )) . '" onclick="return confirm(\'' . __('Підтвердити вихід') . '\');">' . __('Вийти') . '</a>');
		$tpl->set('{js}', Aurus::getInstance()->getClientJs());
		$tpl->set('{VERSION}', VERSION);
		echo $tpl->out();
	}
	
	function loadContoller() {
		if (isset($_GET['system']))
			return;
		if (! isset($_GET['do']) || $_GET['do'] == '') {
			$_GET['do'] = 'index';
		}
		$class = $_GET['do'];
		$addons = Modules::getInstance()->getActiveAddons();
		if (is_file(MAINDIR . '/adminarea/classes/' . $class . '.php')) {
			include MAINDIR . '/adminarea/classes/' . $class . '.php';
			Factory::get('Adminarea_' . $class)->init();
		} elseif (in_array($class, $addons['modules'])) {
			if (class_exists('Module_' . $class)) {
				Factory::get('Module_' . $class)->initAdminArea();
			}
		} else {
			include MAINDIR . '/adminarea/classes/index.php';
			Factory::get('Adminarea_index')->init();
		}
	}
	
	/**
	 * Some kind of constructor.Run all functions, etc.
	 *
	 * @return void
	 */
	function init() {
		$this->getInfo();
		$this->checkLogged();
		Aurus::getInstance()->includeJs(LINK_ROOT . 'scripts/jquery_cookie.js');
		
		Aurus::getInstance()->addAdminConfigPage(__('Головні налаштування'), MAINDIR . '/adminarea/mainconfig.php');
		$tpl = Template::getInstance();
		
		if (isset($_GET['system']) && $_GET['system'] == 'leftmenu') {
			$this->getMenu();
		}
		
		include MAINDIR . '/interfaces/module.php';
		$this->loadContoller();
		$this->_echo();
	}
	
	/**
	 * Print the page
	 *
	 * @return void
	 *
	 */
	function _echo() {
		$tpl = Template::getInstance();
		if (strlen($_SERVER['QUERY_STRING']) < 1) {
			$tpl->setTemplate(file_get_contents(ROOT . '/adminarea/template/main.tpl'));
			$tpl->set('{ROOT}', LINK_ROOT);
			$tpl->set('{js}', Aurus::getInstance()->getClientJs());
			$tpl->set('{THEME}', LINK_ROOT . 'templates/' . Aurus::getInstance()->getTemplateToLoad());
			$tpl->set('{noframes}', __('Ваш оглядач не підтримує фрейми. Будь-ласка, використовуйте той оглядач, який їх підтримує!'));
			echo $tpl->out();
			exit(0);
		}
		
		if (Aurus::getInstance()->getContent()) {
			$tpl->setTemplate(file_get_contents(ROOT . '/adminarea/template/skeleton.tpl'));
			$tpl->set('{content}', '<div style="padding:10px;">' . $d = Aurus::getInstance()->getContent() . '</div>');
			$tpl->set('{ROOT}', LINK_ROOT);
			$tpl->set('{js}', Aurus::getInstance()->getClientJs());
			$tpl->set('{THEME}', LINK_ROOT . 'templates/' . Aurus::getInstance()->getTemplateToLoad());
			echo $tpl->out();
		}
	}
	
	/**
	 * Add block to left menu
	 *
	 * @param string $name - name. A-Za-z
	 * @param string $descr - description
	 * @param integer $pos - Position.
	 * @return
	 */
	function addAdminBlock($name, $descr, $pos = 10) {
		$this->adminblocks[$pos][$name] = $descr;
	}
	
	/**
	 * Додавання певного контенту в блок меню адмінпанелі
	 *
	 * @param string $name - ім'я блоку в котрий потрібно додати посилання
	 * @param string $cont - контент який потрібно додати
	 * @return
	 */
	function addToAdminBlock($name, $cont) {
		if (isset($this->adminblocksCont[$name])) {
			$this->adminblocksCont[$name] .= $cont;
		} else {
			$this->adminblocksCont[$name] = $cont;
		}
	}
	
	/**
	 * Додавання посилання в блок меню адмінпанелі
	 *
	 * @param string $name - ім'я блоку в котрий потрібно додати посилання
	 * @param string $link - саме посилання.Буде виглядати так http://example.com/adminarea/?do=$link
	 * @param string $linkName - назва посилання
	 */
	function addToAdminBlockLink($name, $link, $linkName) {
		$cont = '<a href="#' . $link . '">' . $linkName . '</a>';
		$this->addToAdminBlock($name, $cont);
	}
	
	/**
	 * Повертає оформлене повідомлення для панелі адміністратора
	 *
	 * @param string $info - текст повідомлення
	 * @param bool $backButton - показувати кнопку "Назад" чи ні
	 * @param string $adres - посилання на редирект після завершення часу
	 * @param integer $time - час на прочитання повідомлення
	 * @return
	 */
	function adminInfo($info, $backButton = true, $adres = '', $time = 0) {
		/* $bb = '';
	  return '<center><div align="center" class="info"><center>' . $info . '</center><div align="center">' . $bb . '</div></div></center>'; */
		$script = '';
		if ($time) {
			if ($adres == '') {
				$script = '<script type="text/javascript">window.setTimeout("window.history.go(-1)",1000 * ' . $time . ');</script>';
			} else {
				$script = '<script type="text/javascript">window.setTimeout("window.location.href=\'' . $adres . '\'",1000 * ' . ( int ) $time . ');</script>';
			}
		}
		if ($backButton == true) {
			$bb = '<input type="button" class="input" onclick="window.history.go(-1)" value="' . __('Назад') . '">';
		} else {
			$bb = '';
		}
		
		$tpl = Template::getInstance();
		$tpl->setTemplate(file_get_contents(ROOT . '/adminarea/template/info.tpl'));
		$tpl->set('{script}', $script);
		$tpl->set('{info}', $info);
		$tpl->set('{back}', $bb);
		
		return $tpl->out();
	}
	
	/**
	 * Додавання рядку з інформацією до таблиці інформації в адмінпанелі
	 *
	 * @param string $leftColumn - вміст лівої колонки рядка
	 * @param string $rightColumn - вміст правої колонки рядка
	 * @return
	 */
	function addAdminInfoRow($leftColumn, $rightColumn) {
		$this->adminInfoRows[$leftColumn] = $rightColumn;
	}
	
	/**
	 * Отримання масиву з інформацією до таблиці інформації в адмінпанелі
	 *
	 * @return
	 */
	function getAdminInfoRowArray() {
		return $this->adminInfoRows;
	}
	
	function getAdminBlocks() {
		return $this->adminblocks;
	}
	
	function getAdminBlocksContent() {
		return $this->adminblocksCont;
	}

}